5.2 匹配的重复次数
上节学习的 + 、 * 、 ? 解决了许多问题,但有些问题光靠它们还不够。请思考以下问题:
- ❑
+和*匹配的字符个数没有上限。我们无法为它们将匹配的字符个数设定一个最大值。 - ❑
+、*和?至少匹配零个或一个字符。我们无法为它们将匹配的字符个数另行设定一个最小值。 - ❑ 如果只使用
+和*,我们无法把它们将匹配的字符个数设定为一个精确的数字。
为了解决这些问题并让程序员对重复性匹配有更多的控制,正则表达式语言提供了一个用来设定重复次数(interval)的语法。重复次数要用 { 和 } 字符来给出——把数值写在它们之间。
{ 和 } 是元字符。如果需要匹配“{”和“}”本身,就应该用 \ 对它们进行转义。不过,即使你没有对 { 和 } 进行转义,大部分正则表达式实现也能正确地处理它们(根据具体情况把它们解释为普通字符或元字符)。话虽如此,为了避免不必要的麻烦,你最好不要依赖这种行为;在需要把 { 和 } 当做普通字符来匹配的场合,还是使用它们的转义序列 \{ 和 \} 比较稳妥。
5.2.1 为匹配次数设置一个精确值
如果你想为重复匹配次数设定一个精确的值,把那个数字写在 { 和 } 之间即可。比如说, {3} 意味着模式里的前一个字符(或字符集合)必须在原始文本里连续重复出现 3 次才算是一个匹配;如果只重复了两次,则不算是一个匹配。
还记得我们之前多次使用过的匹配 16 进制颜色值的例子吗?
使用精确值后模式是不是精简了非常多。
5.2.2 为重复匹配次数设定一个区间
{} 语法还可以用来为重复匹配次数设定一个区间——也就是为重复次数设定一个最多值或(和)一个最小值。这种区间以 {最小值,最大值} 这样的形式给出。 {2,4} 的含义是最少重复 2 次,最多重复 4 次。看下面这个匹配 IPV4 地址的例子:
IPV4 由 4 组数字组成,每组数字可能有 1 到 3 位数字。 \d 可以匹配出数字, {1,3} 匹配 1 到 3 位数字,再加上 \. 就可以匹配出 IPV4 地址了。
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 可以匹配出 IPV4,但如果待匹配文本里面有“999.999.999.999”也会被匹配出来。显然“999.999.999.999”并不是有效的 IPV4 地址,你知道怎么做才能只匹配有效的 IPV4 吗?我们将在第七章学习到
5.2.3 匹配至少重复多少次
{} 语法的最后一种用法是给出一个最小重复次数,但不用给出最大。比如 {3,} 表示最少重复 3 次,但不限制最多重复的次数。看下面匹配 URL 地址的例子:
用 https?://[\w.]{3,} 来匹配 URL 并不严谨,请谨慎直接用于生产环境。